#include "main.h"
#include "tim.h"
#include "Hardware_Motor.h"

/**
 * @brief 控制电机正反转运动(设置CCR)
 * 
 * @param Motor_s 电机结构体，包含两个PWM使用的TIM和通道以及占空比、频率
 */
void Motor_Ctrl(Motor_s_Typedef *Motor_s)
{
    // 根据正反转控制PWM占空比
    if ( Motor_s->IsForward )
    {
        __HAL_TIM_SET_COMPARE(Motor_s->PWM1_UsedTIM, Motor_s->PWM1_UsedChannel, (uint32_t)(Motor_s->PWM1_Reso * Motor_s->PWM_Duty));
        __HAL_TIM_SET_COMPARE(Motor_s->PWM2_UsedTIM, Motor_s->PWM2_UsedChannel, 0);
    }
    else
    {
        __HAL_TIM_SET_COMPARE(Motor_s->PWM1_UsedTIM, Motor_s->PWM1_UsedChannel, 0);
        __HAL_TIM_SET_COMPARE(Motor_s->PWM2_UsedTIM, Motor_s->PWM2_UsedChannel, (uint32_t)(Motor_s->PWM2_Reso * Motor_s->PWM_Duty));
    }
}

/**
 * @brief 设置占空比
 *
 * @param Motor_s
 */
void Motor_SetDuty(float _Duty, Motor_s_Typedef *Motor_s)
{
    if(_Duty > 1.0f) _Duty = 1.0f; // 限制占空比最大值为1.0
    if(_Duty < 0.0f) _Duty = 0.0f; // 限制占空比最小值为0.0

    // 设置占空比和正反转
    Motor_s->PWM_Duty = _Duty;

    // 调用控制函数
    Motor_Ctrl(Motor_s);
}

/**
 * @brief 电机转向
 * 
 * @param Motor_s 
 */
void Motor_Turn(Motor_s_Typedef *Motor_s)
{
    if( Motor_s->IsForward )
    {
        Motor_s->IsForward = 0; // 切换到反转
    }
    else
    {
        Motor_s->IsForward = 1; // 切换到正转
    }

    __HAL_TIM_SET_COMPARE(Motor_s->PWM1_UsedTIM, Motor_s->PWM1_UsedChannel, 0);
    __HAL_TIM_SET_COMPARE(Motor_s->PWM2_UsedTIM, Motor_s->PWM2_UsedChannel, 0);

    HAL_Delay(1);

    Motor_Ctrl(Motor_s);
}

/**
 * @brief 初始化函数，结构体Motor_s应该包含以下成员：
 * *          - PWM1_Freq: 第一个PWM的频率
 * *          - PWM2_Freq: 第二个PWM的频率
 * *          - PWM1_UsedTIM: 第一个PWM使用的定时器
 * *          - PWM2_UsedTIM: 第二个PWM使用的定时器
 * *          - PWM1_UsedChannel: 第一个PWM使用的通道
 * *          - PWM2_UsedChannel: 第二个PWM使用的通道
 * 
 * @param Motor_s 
 */
void Motor_Init(Motor_s_Typedef *Motor_s)
{
    // 初始化电机状态
    Motor_s->PWM_Duty = 0.0f; // 初始占空比为0
    Motor_s->IsForward = 1;   // 默认正转

    // 需要提前初始化TIM

    // 设置初始占空比
    Motor_Ctrl(Motor_s);

    // 启动PWM输出
    // HAL_TIM_PWM_Start(Motor_s->PWM1_UsedTIM, Motor_s->PWM1_UsedChannel);
    // HAL_TIM_PWM_Start(Motor_s->PWM2_UsedTIM, Motor_s->PWM2_UsedChannel);
}
